寫程式一定會面臨修改,所以先前的在套DomainEvent
時,需要實作事件本身的版本,序列化後的event store會紀錄當時產生時的版號,以供未來程式異動時,不同的資料長相的對應
impl DomainEvent for ReaderEvent {
fn event_type(&self) -> String {
"ReaderEvent".to_string()
}
fn event_version(&self) -> String {
"0.1.0".to_string()
}
}
第一個是事件的類別,第二個是事件的版本,在持久化儲存之後,如果程式修改新的版本,則需要儘可能保持向下相容性。
比如新開的欄位就需要使用 Option 的方式,避免在 event soucing重滾舊版事件時報錯。
版本的規則可以自己定義,或者依kuma大大所述使用業界標準,版本大部分還是使用語意化版本(Semantic Versioning)
而upcaster是一種把舊版本事件映射到現存程式版本的一個方式,如果隨著程式更迭版本落差太大,則可能需要做一個切點重新migration到新版本上,這部分相對不好處理。
CQRS 對比CRUD讓我們分離了讀寫使用同一個模型,但也增加了另一個部分的複雜度,接下來試試看實作upcaster,看能不能順利實作成功。